docker compose 环境变量配置
docker compose up 会自动加载同目录下的 .env 文件。
但是,这里有一个非常容易踩坑的核心区别,你必须要 注意:
默认情况下,自动加载的 .env 文件只作用于 docker-compose.yml 文件本身的变量替换,不会自动传递给容器内部运行的代码(如你的 Node.js 应用)。
为了让你彻底明白,请看以下两种场景:
场景一:用于 docker-compose.yml 内部的变量替换(自动生效)
如果你的 .env 文件里有:
HOST_PORT=8018
在 docker-compose.yml 中,你可以直接使用 ${HOST_PORT},Docker Compose 会自动 读取 .env 并替换它:
services:
api:
image: my-api
ports:
- "${HOST_PORT}:8018" # 这里会自动变成 "8018:8018"
场景二:让容器内的代码读取到 .env(需要手动配置)
如果你的 Node.js 代码里写了 process.env.ZY_API_KEY,并且这个 Key 写在同目录的 .env 文件里,容器内的代码默认是读不到的。
要让容器内的应用读取到环境变量,你必须在 docker-compose.yml 中显式地传递它们。有两种常用方法:
方法 A:使用 env_file(推荐,直接把整个文件传进容器)
services:
api:
build: .
ports:
- "8018:8018"
env_file:
- .env # 明确告诉 Docker 把这个文件里的所有变量注入到容器中